home *** CD-ROM | disk | FTP | other *** search
- Program Joystick;
- uses CRT;
-
- const Gameport=$201;
- Timer0=$40;
- TControl=$43;
- MaxLoops=5000;
- Button1=$10; Button2=$20; Button3=$40; Button5=$80;
- Xaxis1=$01; Yaxis1=$02; Xaxis2=$04; Yaxis2=$08;
-
- var X,Y:word;
- Procedure GetJoy; assembler;
- label loop1,loop2,axis1,loop3,axdone;
-
- asm
- cli {disable interrupts}
- mov dx,Gameport; {set port adress}
- mov cx,MaxLoops;
- mov al,0;
- out TControl,al; {latch count in timer0}
- in al,Timer0; {low byte of timer count}
- mov ah,al;
- in al,Timer0; {high byte of timer count}
- xchg al,ah;
- mov bx,ax; {start count in BX}
- out dx,al; {trigger game port}
- in al,dx
- loop1:
- in al,dx; {Read Gameport}
- mov ah,al;
- and ax,$0201; {X axis in al; Y axis in ah}
- test al,Xaxis1; {is X axis done?}
- jz axis1;
- test ah,Yaxis1; {is Y axis done?}
- loopnz loop1;
- {Y axis done first!}
- out TControl,al;
- in al,Timer0; {low byte of Y axis count}
- mov ah,al;
- in al,Timer0; {high byte of Y axis count}
- xchg al,ah
- push ax {store Y axis count on the stack}
- loop2:
- in al,dx;
- and al,Xaxis1;
- test al,Xaxis1; {Test X axis}
- loopnz loop2;
- {X axis done(after Y)}
- out TControl,al;
- in al,Timer0;
- mov ah,al;
- in al,Timer0;
- xchg al,ah {X axis count}
- sub ax,bx; {find difference}
- neg ax
- mov X,ax; {Save X axis time}
- pop ax; {Get Y axis count}
- sub ax,bx
- neg ax
- mov Y,ax; {Save Y axis time}
- jmp axdone {We're done.}
-
- axis1: {X axis done first}
- out TControl,al;
- in al,Timer0
- mov ah,al
- in al,Timer0
- xchg al,ah
- push ax {Store X axis count on the stack}
- loop3:
- in al,dx
- and al,Yaxis1;
- test al,Yaxis1;
- loopnz loop3;
- {Y is done}
- out TControl,al;
- in al,Timer0;
- mov ah,al
- in al,Timer0
- xchg al,ah
- sub ax,bx
- neg ax
- mov Y,ax {Save Y axis Time}
- pop ax {Get X axis count}
- sub ax,bx
- neg ax
- mov X,ax {Save X axis count}
- axdone:
- sti
- end;
-
- var b1,b2,b3,b4:byte;
- Procedure Getbutton; assembler;
- label bt2,bt3,bt4,done;
-
- asm
- mov b1,0
- mov b2,0
- mov b3,0
- mov b4,0
- mov dx,Gameport;
- in al,dx;
- test al,$10;
- jnz bt2 {there must be a better way to do this}
- mov b1,1
- bt2:
- test al,$20;
- jnz bt3
- mov b2,1
- bt3:
- test al,$40;
- jnz bt4;
- mov b3,1;
- bt4:
- test al,$80;
- jnz done;
- mov b4,1
- done:
- end;
-
- var k:char; done:boolean; MaxX,Minx,MaxY,MinY:word;
- MX,MY:byte; {percent-adjusted centered joystick values}
- CX,CY,D:byte; {Cursor positions and loop Delay}
-
- Begin
- ClrScr;
- done:=false;
- GetJoy;
- MaxX:=X; MinX:=X; MaxY:=Y; MinY:=Y; {initial values}
- Writeln('Whip that joystick around until the 4 leftmost numbers stop changing,');
- writeln('then center the joystick and press button 1 or any key.');
- if KeyPressed then k:=ReadKey; {Clear KeyBuffer}
- while not done do begin
- GetJoy;
- if X>=MaxX then MaxX:=X; {find the range of the joystick}
- if X<=MinX then MinX:=X;
- if Y>=MaxY then MaxY:=Y;
- if Y<=MinY then MinY:=Y;
- gotoxy(1,5);
- Writeln(MinX,' ',MaxX,' ',X,' ');
- Writeln(MinY,' ',MaxY,' ',Y,' ');
- GetButton;
- if B1=1 then Done:=true;
- if KeyPressed then Done:=true;
- end;
- if KeyPressed then k:=ReadKey;
- X:=round(((X-MinX)/MaxX)*100); {Percent-adjust: this scales }
- Y:=round(((Y-MInY)/MaxY)*100); { the number to between 1 and 100.}
- MX:=X; MY:=Y;
- done:=false;
- gotoxy(1,8);
- Write('Press any key.');
- if KeyPressed then k:=Readkey;
- while not done do begin
- GetJoy;
- X:=round(((X-MinX)/MaxX)*100);
- Y:=round(((Y-MInY)/MaxY)*100);
- gotoxy(1,9);
- GetButton;
- Write(X,' ',Y,' ',B1,B2,B3,B4,' ');
- if keypressed then Done:=true;
- end;
- k:=Readkey;
- CX:=40; CY:=10; {Initial cursor position}
- D:=100;
- Done:=False;
- ClrScr;
- Writeln('Use the joystick to change cursor positions.');
- Writeln('buttons 1 and 2 write smiley faces,');
- Writeln('buttons 3 and 4 change joystick speed.');
- writeln('Press any key to exit.');
- while not done do begin;
- GetJoy;
- X:=round(((X-MinX)/MaxX)*100);
- Y:=round(((Y-MInY)/MaxY)*100);
- if X>MX+10 then CX:=CX+1; {change cursor position?}
- if X<MX-10 then CX:=CX-1;
- if Y>MY+10 then CY:=CY+1;
- if Y<MY-10 then CY:=CY-1;
- if CX>80 then CX:=1; {there is probably a faster way }
- if CX<1 then CX:=80; {to do this using mod. }
- if CY>23 then CY:=1;
- if CY<1 then CY:=23;
- gotoxy(1,24);
- write(D,' ');
- gotoxy(CX,CY);
- GetButton;
- if b1=1 then write(chr(1));
- if b2=1 then write(chr(2));
- if b3=1 then D:=(D+1)mod 250;
- if b4=1 then D:=(D-1)mod 250;
- if Keypressed then done:=true;
- delay(D);
- end;
- k:=Readkey;
- end.
- And before I did this, I couldn't progam more than 2 lines of Asm.
-
- --- Renegade v10-05 Exp
- * Origin: The Digital Domain - (716) 791-4849 (1:260/149)
- SEEN-BY: 270/101 280/1 396/1 3615/50 51
- PATH: 260/149 10 1 270/101 396/1 3615/50
-